﻿#ifndef PIPEWRAP_H
#define PIPEWRAP_H

#include <cstdint>

namespace toolkit {


// 管道包装类，用于封装管道操作，支持 Windows 和 POSIX 系统
class PipeWrap {
public:
    PipeWrap();
    ~PipeWrap();

    /**
     * @brief 向管道写入数据
     * @param buf 指向要写入数据的缓冲区指针
     * @param n 要写入的数据字节数
     * @return 实际写入的字节数，若出错则返回 -1
     */
    int writeData(const void *buf, int n);

    /**
     * @brief 从管道读取数据
     * @param buf 指向用于存储读取数据的缓冲区指针
     * @param n 要读取的数据字节数
     * @return 实际读取的字节数，若出错则返回 -1
     */
    int readData(void *buf, int n);

    /**
     * @brief 获取管道的读取端文件描述符
     * @return 管道读取端的文件描述符
     */
    int getReadFd() const { return _pipeFd[0]; }

    /**
     * @brief 获取管道的写入端文件描述符
     * @return 管道写入端的文件描述符
     */
    int getWriteFd() const { return _pipeFd[1]; }

    /**
     * @brief 重新打开管道
     */
    void reOpen();

private:
    /**
     * @brief 关闭管道的文件描述符
     */
    void clearFd();

private:
    // 管道的文件描述符数组，_pipeFd[0] 为读取端，_pipeFd[1] 为写入端
    int _pipeFd[2] = { -1, -1 };
};
} // namespace toolkit

#endif // PIPEWRAP_H

